#include <cstdio>
#include <string>
#include <memory>
#include "vl_structure.h"
using namespace VL;

int check1() {

	SimpleHashMap<int, int> map = {{1, 1}};
	if(map.size() != 1) {
		return 1;
	}
	map.emplace(1, 2);
	if(map.size() != 1) {
		return 2;
	}

	map.emplace(2, 2);

	if(map.find(1) == map.end()) {
		return 3;
	}

	if(map.find(3) != map.end()) {
		return 4;
	}

	for(int i = 0 ; i < 100 ; i ++) {
		map.emplace(i, i);
	}

	if(map.size() != 100) {
		return 5;
	}
	return 0;
}

int check2() {
	SimpleHashMap<int, std::shared_ptr<int>> map = {{1, std::make_shared<int>(1)}};
	if(map.size() != 1) {
		return 1;
	}
	map.emplace(1, std::make_shared<int>(2));
	if(map.size() != 1) {
		return 2;
	}

	map.emplace(2, std::make_shared<int>(2));
	if(map.find(1) == map.end()) {
		return 3;
	}

	if(map.find(3) != map.end()) {
		return 4;
	}

	for(int i = 0 ; i < 100 ; i ++) {
		map.emplace(i, std::make_shared<int>(i));
	}

	if(map.size() != 100) {
		return 5;
	}

	auto iter = map.find(100);

	return 0;
}

int check3() {
	struct A { 
		A(const int& num): num(num) {}
		int num = 0; 
		bool operator==(const A& other) const {
			return this->num == other.num;
		}
	};
	class AHash {
	public:
		size_t operator()(const A& a) const { return a.num; }
	};
	SimpleHashMap<A, int, AHash> map = { { 0, 1 }, { 5, 12 } };
	for(int i = 0 ; i < 100 ; i ++) {
		auto iter = map.emplace(i, i + 100);
		iter->second = 500;
	}

	for(auto iter : map) {
		printf("A: %d, value: %d\n", iter.key.num, iter.value);
	}
	for(auto iter = map.begin() ; iter != map.end() ; iter ++) {
		printf("A2: %d, value: %d\n", iter->key.num, iter->value);
	}

	return 0;
}

int main(int argc, const char ** argv) {
	int ret = 0;
	// if((ret = check1()) != 0) {
	// 	printf("check1 error: %d\n", ret);
	// 	return 0;
	// }
	// if((ret = check2()) != 0) {
	// 	printf("check2 error: %d\n", ret);
	// 	return 0;
	// }
	if((ret = check3()) != 0) {
		printf("check3 error: %d\n", ret);
		return 0;
	}


	return 0;
}


